// 导入组件
import { Message } from 'element-ui'
// 导入axios
import axios from 'axios'
// 导入Vuex
import store from '@/store'
// 导入判断token是否过期的方法
import timeKey from './timeKey'
// 导入路由
import router from '@/router'
// 设置基础设置 基地址 请求和响应拦截器
// 创建对象
const service = axios.create({
  // 基地址(公共路径)
  baseURL: process.env.VUE_APP_BASE_API,
  // 请求超时
  timeout: 5000
})

// 添加请求拦截器
service.interceptors.request.use(function(config) {
  // 在发送请求之前做些什么
  const token = store.state.user.token
  if (token) {
    // 如果token过期
    if (timeKey() === false) {
      // 调用vuex中的action 删除token删除用户信息
      store.dispatch('user/logout')
      // 跳转页面
      router.push('/login')
      // 返回一个promise并抛出一个错误
      return Promise.reject(new Error('token失效'))
    }
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, function(error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
service.interceptors.response.use(function(response) {
  // 解构响应的数据
  const { success, message, data } = response.data
  // 如果响应成功
  if (success) {
    // 返回data
    return data
  }
  // 如果失败提示用户
  Message.error(message)
  // 返回一个失败的promise并抛出一个error error可以抛出错误信息包括出错文件位置
  return Promise.reject(new Error(message))
}, function(error) {
  console.dir(error)
  // token失效 后删除token和用户信息 跳转到登录页面
  const { message, code } = error.response.data
  if (code === 10002) {
    // 调用Vuex中的actions删除token和用户信息
    store.dispatch('user/logout')
    // 跳转页面
    router.push('/login')
  }
  if (message) {
    Message.error(message)
  }
  return Promise.reject(error)
})

// 导出
export default service
